////////////////////////////////////////////////////////////////////////////////
/*! \file
 * \brief Windows declaration file for the library-object.
 *
 * \author Ivo Wingelaar
 * \date 2011
 * \version 0.1.1
 * \copyright GNU Lesser General Public License v3
 */
////////////////////////////////////////////////////////////////////////////////

#ifndef __MYTH_DYNAMIC_LIBRARY_WINDOWS_C_HPP_INCLUDED__
#define __MYTH_DYNAMIC_LIBRARY_WINDOWS_C_HPP_INCLUDED__

#include "MythDynamic.hpp"

#ifdef _MYTH_WINDOWS_

#include <windows.h>

namespace Myth
{
namespace Dynamic
{

////////////////////////////////////////////////////////////////////////////////
//! An interface providing access to dynamically loaded libraries on windows.
class LibraryWindows_C : public Library
{
public:
    ////////////////////////////////////////////////////////////////////////////
    //! Default constructor.
    LibraryWindows_C(void);

    ////////////////////////////////////////////////////////////////////////////
    //! Constructor.
    LibraryWindows_C(const std::string& name);

    ////////////////////////////////////////////////////////////////////////////
    //! Virtual destructor.
    virtual ~LibraryWindows_C(void);

    ////////////////////////////////////////////////////////////////////////////
    //! Searches for the specified symbol and returns it if found.
    virtual void* get_symbol(const std::string& symbol_name, std::string* error_message = 0);

    ////////////////////////////////////////////////////////////////////////////
    //! Returns if the library was loaded succesfuly.
    bool is_valid(void) const;

    ////////////////////////////////////////////////////////////////////////////
    //! Returns the system-specific error message.
    std::string get_error(void) const;

private:
    ////////////////////////////////////////////////////////////////////////////
    // Member data
    ////////////////////////////////////////////////////////////////////////////

    HMODULE     mLibrary; ///< The pointer to the library.
    std::string mError;   ///< The error message.
};

} // namespace Dynamic
} // namespace Myth

#endif // _MYTH_WINDOWS_

#endif // __MYTH_DYNAMIC_LIBRARY_WINDOWS_C_HPP_INCLUDED__

